{+++++++++++++++++++++++++ НАЧАЛО СКАНЕРА +++++++++++++++++++++++++++++}
Procedure Scan;
{***************************************}
Procedure setpr(nit:byte);
Begin
 pr[up].kll:=chr(kll);
 pr[up].nit:=nit;
 pr[up].str:=str;
 up:=up+1;
 if up>kepr then
              begin
                writeln('Переполнение,слишком большая программа');
                halt(1);
              end;
End;

(***************************************)
Procedure Chfend(cerr:string);
Begin
 if fend then
            begin
              writeln(cerr);
              halt(1);
            end;
End;
(*******************3********************)
Procedure Getchar;
Begin
 if not eof (fin)
     then
      read(fin,ch)
     else fend:=true;
End;
(***************************************)
BEGIN
 lit:=['0'..'9','a'..'z','A'..'Z'];
 dec:=['0'..'9'];
 kint:=0; kid:=0; kstr:=0;up:=1;str:=1;
 ras:=['+','-','*','/',';',')','(','=',',',':','<','>'];
 fend:=false;

 getchar;

 repeat

  fts:=false;
  (* Цифра ? *)
  if ch in dec
           then  begin
                   dint:='';
                   kll:=ord('D');
                   { десятичные константы }
                  repeat
                   dint:=dint+ch;getchar;
                  until not(ch in dec) or fend;

                    val(dint,w,r2);
                    if (length(dint)>5) or (w>32767)
                               then er('Слишком большое число',1);

                         if kint=0 then
                             begin
                               i:=1;tab_int[i]:=dint;
                               kint:=1;
                             end
                    else
                     begin
                       i:=0;
                       repeat
                        i:=i+1;
                       until (dint=tab_int[i]) or (i=kint+1);
                        if i=kint+1 then
                                    begin
                                     kint:=kint+1;tab_int[i]:=dint;
                                    end;
                     end;
                  fts:=true;setpr(i);
                 end;
  (* Индификатор/Ключевое слово ? *)
  if ch in ['a'..'z','A'..'Z']
           then Begin {1}
                  id_ssl:='';
                 repeat
                  id_ssl:=id_ssl+UpCase(ch);
                  getchar;
                 until not(ch in lit) or fend;
                  (* Ключевое слово ? *)
                   i:=0;
                   repeat
                    i:=i+1;
                   until (id_ssl=keyw[i]) or (i=kkw+1);

                     if i<>kkw+1 then
                        (* Да ключевое слово *)
                        kll:=ord('S')
                          else
                            begin {2}
                              kll:=ord('I');
                              (* Индификатор *)
                                if kid=0 then begin  {3}
                                             i:=1;tab_id[1]:=id_ssl;
                                             kid:=1;
                                              end     {3}
                                else
                                 begin      {3}
                                   i:=0;
                                   repeat
                                    i:=i+1;
                                   until (id_ssl=tab_id[i]) or (i=kid+1);
                                    if i=kid+1 then
                                                begin        {4}
                                                 kid:=kid+1;
                                                 tab_id[i]:=id_ssl;
                                                end;          {4}
                                  end;        {3}
                            end;   {2}
                  fts:=true;
                  setpr(i);
                End;{1}
   (***** Разделитель ? + * - / ; , ()  ****)
   if ch in ras
            then
            begin
             kll:=ord('R');
             i:=0;
             repeat
              i:=i+1;
             until ch=tab_ras[i];
             getchar;
             fts:=true;
             setpr(i);
            end;
    (* строковая константа *)
    if ch='"' then
                  begin
                   strc:='';kll:=ord('L');
                   getchar;
                  repeat
                   strc:=strc+ch;
                   getchar;
                  until (ch='"') or fend;

                   chfend('Неожиданный конец файла');

                   strc:=strc+'$';

                         if kstr=0 then
                           begin
                             i:=1;kstr:=1;
                             tab_str[1]:=strc;
                           end
                    else
                         begin
                            i:=0;
                           repeat
                             i:=i+1;
                           until (strc=tab_str[i]) or (i=kstr+1);
                              if i=kstr+1 then
                                      begin
                                        kstr:=kstr+1;
                                        tab_str[i]:=strc;
                                      end;
                         end;
                  fts:=true;getchar;
                  setpr(i);
                  end;

   if ch=#32
            then
               begin
                 getchar;
                 fts:=true;
               end;



   if ch=#13 then
             begin
               getchar;
               if ch=#10 then
                 begin
                  str:=str+1;
                  getchar;
                 end;
               fts:=true;
             end;



  if not fts then
                begin
                 write('Символ ',ch,' с кодом ',ord(ch));
                 writeln(' не пренадлежит алфавиту');
                 sound(400);delay(500);
                 nosound;halt(1);
                end;
 until fend;
 gstr:=str;
END;
{*********************** КОНЕЦ СКАНЕРА **************************}
